package com.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.common.R;
import com.entity.Employee;
import com.service.EmployeeService;
import lombok.extern.java.Log;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;
    //    --------员工登陆--------
    //@responsebody   作用：将方法的返回值，以特定的格式写入到response的body区域，进而将数据返回给客户端。
    //@requestbody注解可以将前端传递过来的json数据转化为java对象，request对象用来创建session接收该用户的id方便下次获取
    //因为登陆传递过来的是员工信息，泛型可以使用empolyee进行封装
    @PostMapping("/login")
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){
        //      1、将页面提交的密码password进行md5加密处理
        String password= employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        //      2、根据页面提交的用户名username查询数据库
        LambdaQueryWrapper<Employee> lqw=new LambdaQueryWrapper<>();
        lqw.eq(Employee::getUsername,employee.getUsername());
        Employee emp = employeeService.getOne(lqw);
        //      3、如果没有查询到则返回登录失败结果
        if (emp==null){
            return R.error("用户名不存在");
        }
        //      4、密码比对，如果不一致则返回登录失败结果
        if (!emp.getPassword().equals(password)){
            return R.error("密码错误！");
        }
        //      5、查看员工状态，如果为已禁用状态，则返回员工已禁用结果
        if (emp.getStatus()==0){
            return R.error("已被封号（流汗）");
        }
        //      6、登录成功，将员工id存入Session并返回登录成功结果
        request.getSession().setAttribute("id",emp.getId());
        return R.success(emp);
    }
    //登陆退出功能
    @PostMapping("/logout")
    public R<String> logOut(HttpServletRequest request){
        //获取session删除session
        request.getSession().removeAttribute("id");
        //返回删除成功值
        return R.success("退出成功");
    }
    //新增员工保存
    @PostMapping
    public R<String> save(HttpServletRequest request,@RequestBody Employee employee){
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));//给新增的员工设置默认密码，并对密码进行加密
       // employee.setCreateTime(LocalDateTime.now());//设置创建的时间
        //employee.setUpdateTime(LocalDateTime.now());//设置更新的时间
        //long id = (long)request.getSession().getAttribute("id");
        //employee.setCreateUser(id);//设置操作人员的id
        //employee.setUpdateUser(id);//设置操作人员的id
        //调用service保存方法
        boolean save = employeeService.save(employee);
        //返回保存成功的信息
        return R.success("保存成功");
    }
    //员工分页查询
    @GetMapping("/page")
     public R<Page> page(int page,int pageSize,String name){
//        log.info("page: "+page+" pagesize:"+pageSize+" name:"+name);
        //创造分页构造器
        Page pageInfo=new Page(page,pageSize);//把分页需要的参数（当前页数，和单页显示数据）添加进去
        //创造条件构造器
        LambdaQueryWrapper<Employee> lqw=new LambdaQueryWrapper();
        //为条件构造器添加动态查询的条件
        //对是否要模糊查询增加了判断！
        lqw.like(StringUtils.isNotEmpty(name),Employee::getName,name);
        //为条件构造器添加排序方法
        lqw.orderByDesc(Employee::getCreateTime);
        //执行查询
        employeeService.page(pageInfo,lqw);//不用设置返回条件，查询完毕后会自动将集合和总数数据封装到pageinfo里面
                                           //将数据集合封装到Page对象的records属性里，总数封装到total属性里
        //返回结果给前端
        return R.success(pageInfo);
     }
     //更改员工信息
    @PutMapping
    public R<String> updateById(HttpServletRequest request,@RequestBody Employee employee){
//        long id = Thread.currentThread().getId();
//        log.info("线程为："+id);
        //long id = (long)request.getSession().getAttribute("id");//获取当前登陆者的账号id
        //employee.setUpdateTime(LocalDateTime.now());//更改修改时间
       // employee.setUpdateUser(id);//更改修改者的信息
        employeeService.updateById(employee);//调用service方法传递一个实体类对象更改员工信息
        return R.success("修改成功！");
    }
    //再编辑员工信息前的回显数据
    @GetMapping("/{id}")
    public R<Employee> getById(@PathVariable long id){
        Employee employee = employeeService.getById(id);
        if (employee!=null){
            return R.success(employee);
        }
        return R.error("查询数据失败");
    }
}

